package 多态.向上转移和向下转型.向上转型;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 姚东名
 * Date: 2024-06-16
 * Time: 20:50
 */
/*
向上转型：实际就是创建一个子类对象，将其当成父类对象来使用
语法格式：父类类型 对象名 = new 子类类型()
Animal animal = new Cat("mimi", 12);

animal是父类类型，但可以引用一个子类对象，因为是从小范围向大范围的转换。
【使用场景】
    1. 直接赋值
    2. 方法传参
    3. 方法返回
 */
/*public class TestAnimal {
    //
    public static void eatFood(Animal animal) {
        animal.eat();
    }

    public static Animal buyAnimal(String val) {
        if("狗".equals(val)) {
            return new Animal("狗狗", 12);
        }else if("猫".equals(val)) {
            return new Animal("猫猫", 9);
        }else {
            return null;
        }
    }

    public static void main(String[] args) {
        Animal cat = new Animal("元宝", 20);
    }
}*/
public class TestAnimal {
    // 2. 方法传参：形参为父类型引用，可以接收任意子类的对象
    public static void eatFood(Animal a){
        a.eat();
    }
    // 3. 作返回值：返回任意子类对象
    public static Animal buyAnimal(String var){
        if("狗".equals(var) ){
            return new Dog("狗狗",1);
        }else if("猫" .equals(var)){
            return new Cat("猫猫", 1);
        }else{
            return null;
        }
    }
    public static void main(String[] args) {
        Animal cat = new Cat("元宝",2);//1. 直接赋值：子类对象赋值给父类对象
        Dog dog = new Dog("小七", 1);

        eatFood(cat);
        eatFood(dog);

        Animal animal = buyAnimal("狗");
        animal.eat();
        animal = buyAnimal("猫");
        animal.eat();
    }
}

/*
元宝吃猫粮
小七吃狗粮
狗狗吃狗粮
猫猫吃猫粮
 */

/*
向上转型的优点：让代码实现更简单灵活。
向上转型的缺陷：不能调用到子类特有的方法。
 */
